#pragma once
#include <iostream>
#include <fstream>
#include "Log.hpp"
using namespace LogModule;

class Util
{
public:
    static bool ReadFile(const std::string &file_path, std::string &content)
    {
        // 必须要按照二进制的方式读取数据，否则非文本数据无法传输
        std::ifstream file(file_path, std::ios::binary);
        if (!file.is_open())
        {
            LOG(LogLevel::ERROR) << "Util::ReadFile: 无法打开文件[" << file_path << "]! " << strerror(errno);
            return false;
        }

        size_t file_size = FileSize(file_path);
        content.resize(file_size);
        // 5. 读取二进制数据到字符串
        if (!file.read(&content[0], file_size))
        {
            LOG(LogLevel::ERROR) << "Util::ReadFile: 读取文件失败[" << file_path << "]! ";
            return false;
        }
        file.close();
        return true;
    }
    static bool ReadLine(std::string &message, const std::string &sep, std::string &one_line)
    {
        auto pos = message.find(sep);
        if (pos == std::string::npos)
        {
            LOG(LogLevel::WARNING) << "Util::ReadLine: 未能提取出一行! ";
            return false;
        }
        one_line = message.substr(0, pos);
        message.erase(0, pos + sep.size());
        return true;
    }
    static size_t FileSize(const std::string &path)
    {
        // 以二进制模式打开文件（避免文本模式下的换行符转换影响计算）
        std::ifstream file(path, std::ios::in | std::ios::binary);
        if (!file.is_open())
        {
            LOG(LogLevel::ERROR) << "无法打开文件: " << path << strerror(errno);
            return -1; // 打开失败返回-1
        }

        // 将读指针移动到文件末尾
        file.seekg(0, std::ios::end);
        // 获取当前指针位置（即文件大小）
        size_t size = file.tellg();

        return size;
    }
};